Shadow DOM
Can I Use
#WIP
https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_shadow_DOM
それにより、カスタム要素のマークアップ構造、スタイル、および動作をページ上の他のコードから分離し、コンフリクトが起きないようにすると同時に、コードを綺麗に保つことができます
Shadow DOM API を使用すると、指定された要素に隠されたDOMツリー(シャドウツリー)をアタッチすることもできます
DOMをカプセル化する
JavaScriptやCSSのscopeを作る
外部からの影響を受けない
継承されないってことか
CSS Custom Propertyなら外からstyleを加えられる
良いのか #??
Reactのpropsみたいなイメージか?
外部へ影響しない
Shadow Root
カプセル化したDOMのroot
https://gyazo.com/715e0ca6241bbd310f016348f4096bbd https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM
code:js
const div = document.getElementById('area');
const shadowRoot = div.attachShadow({ mode: 'open' });
Shadow Host
通常のDOMであり、Shadow Rootをぶら下げる部分のDOM
#??
Shadow DOMとCustom Elementの指しているものの違いがわからん
code:html
<style>
.pink {
--color: pink;
}
</style>
<my-button class="pink">my button</my-button>
code:css
button {
background-color: var(--color);
}
カプセル化された「シャドウ」 DOM ツリーを要素に紐付け、関連する機能を制御するための、一連の JavaScript API
シャドウ DOM ツリーは、メイン文書の DOM とは別にレンダリングされる
こうして、要素の機能を公開せずに済み、文書の他の部分との重複を恐れることなく、スクリプト化やスタイル化できる
ReactのComponentみたいなもの #??
attachShadow
https://zenn.dev/uhyo/articles/next-gen-css-in-js#shadow-dom
code:html
<div id="area" style="border: 1px solid #666666">
<p>Hello, world!</p>
</div>
code:js
const div = document.getElementById('area');
// divにShadow Rootをアタッチする
const shadowRoot = div.attachShadow({ mode: 'open' });
// Shadow Rootの中身を書く
shadowRoot.innerHTML = `
<style>
p {
border: 1px solid red;
}
</style>
<p>↓↓↓↓↓</p>
<slot></slot>
<p>↑↑↑↑↑</p>
`;
↑こう書いた時に、↓こういうイメージのものになる
code:html
<div id="area" style="border: 1px solid #666666">
<style>
p {
border: 1px solid red;
}
</style>
<p>↓↓↓↓↓</p>
<p>Hello, world!</p>
<p>↑↑↑↑↑</p>
</div>
ただし、このp {..}のstyleは、<p>Hello, world!</p>に対しては適用されない
slotで埋め込んだものに対しては適用されない
styled-componentsってこうなってたっけ?
styleの指定の仕方にもよるけど、普通はそうなってるか。
Declarative Shadow DOM
https://web.dev/declarative-shadow-dom/
これがあれば、Web ComponentsベースのCSS in JSでSSRをうまいことできるからです(逆に言えば、これがないとWeb ComponentsのSSRが結構厳しいです)。 ref
/mrsekut-book-486246517X/046
#??
どういうもの?
JSが必須?
何が嬉しい? 
Custom Elementとは別概念ということは、Custom Elment onlyだと外界に影響するのか?
React Componentはこれらを内包していると思うが、なぜ別概念なの?
/kadoyau/Chrome dev toolsでShadow DOMを表示する
https://qiita.com/alangdm/items/cec32f21151a9da3c3f2
https://web.dev/shadowdom-v1/